//「一本通 1.1 例 5」智力大冲浪
#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;
const int MAXN=500;
int m,n;
int t[MAXN+1],w[MAXN+1];
struct wNode
{
    int id;
    bool operator<(const wNode other)const{
        return w[id]<w[other.id];
    }
};
struct  tNode
{
    int id;
    bool operator<(const tNode other)const{
        return t[id]<t[other.id];
    }
};

bool finished[MAXN+1];
tNode games[MAXN+1];
priority_queue<wNode> heap;
int main(){
    cin>>m>>n;
    for(int i=1;i<=n;i++) cin>>t[i];
    for(int i=1;i<=n;i++) cin>>w[i];
    for(int i=1;i<=n;i++) games[i-1]={i};
    sort(games,games+n);//游戏按完成期限排序
    int maxt=t[games[n-1].id];//最大的完成期限
    int cur=n-1;
    for(int i=maxt;i>=1;i--){//从最大的完成期限开始向前安排游戏
        while(cur>=0&&t[games[cur].id]>=i) {//游戏从后向前找，找到每个期限大于等于当前限期i的，将其入堆
            heap.push({games[cur].id});
            cur--;
        }
        if (!heap.empty()){//取堆顶，即堆中不完成扣款最大的游戏，将它安排完成
            finished[heap.top().id]=true;
            heap.pop();
        }
    }

    int ans = m;

    for (int i = 1; i <= n; i++)
        if (!finished[i])
            ans -= w[i];

    cout << ans;
}